package com.shujia.wyh.day12;

import java.io.*;

/*
    将对象像数据流一样在网络中传输的过程，叫做序列化流
    序列化： 对象 ---> 数据流 ObjectOutputStream
    反序列化： 数据流 --- > 对象  ObjectInputStream

    我们正常按照思路创建序列化对象，将对象写到文件中后发现，出错了：NotSerializableException
    观察api发现，因为Teacher类没有实现Serializable接口，而又观察api得知Serializable接口中没有任何的常量和抽象方法
    而这种接口，我们一般称之为标记接口。

    我们正常写和读是没有问题，但是当我们修改了对象的类之后，再进行读取的时候发现，报错了
    com.shujia.wyh.day12.Teacher;
    local class incompatible:
        stream classdesc serialVersionUID = 5110993845480645297,
        local class serialVersionUID = 7384147610509976649

   解决方案：无论我们怎么修改对象类中内容，这个serialVersionUID一直不变就好了。
   如果不想让某个成员做序列化，使用transient关键字进行修饰
 */
public class ObjectOutputStreamDemo1 {
    public static void main(String[] args) {
        //创建一个对象
        Teacher t1 = new Teacher("小虎", 18);
//        write(t1);
        Object o = read();
        System.out.println(o);
    }

    public static Object read(){
        ObjectInputStream ois = null;
        Object o = null;
        try {
            //创建反序列化对象
            ois = new ObjectInputStream(new FileInputStream("java/src/com/shujia/wyh/day12/obj.txt"));
            o = ois.readObject(); //new Teacher("小虎", 18);
            return o;

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            if(ois!=null){
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return o;

    }

    public static void write(Object obj){
        ObjectOutputStream oos = null;
        try {
            //创建序列化流对象
            oos = new ObjectOutputStream(new FileOutputStream("java/src/com/shujia/wyh/day12/obj.txt"));
            oos.writeObject(obj);
            oos.flush();
        }catch (IOException e){
            e.printStackTrace();
        }finally {
            if(oos!=null){
                try {
                    oos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
